﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Xml.Linq;
using System.Runtime.Serialization;
using System.Net;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class ConsultaCEP : System.Web.Services.WebService
{
    [WebMethod]
    public EnderecoCEP GetEnderecoByCEP(string CEP)
    {
        string _resultado = "0";

        EnderecoCEP _endereco = new EnderecoCEP();

        try
        {
            string parametros = "cepEntrada=" + CEP.Replace("-", "").Trim() + "&tipoCep=&cepTemp=&metodo=buscarCep";

            WebRequest request = WebRequest.Create("http://m.correios.com.br/movel/buscaCepConfirma.do?" + parametros);

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            StreamReader stream = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"));

            string dados = stream.ReadToEnd();
            int count = 0;
            string ExpressaoRegular = "<span class=\"respostadestaque\">(.*?)</span>";
            MatchCollection mc = Regex.Matches(dados, ExpressaoRegular, RegexOptions.Singleline | RegexOptions.IgnoreCase);
            
            foreach (Match m in mc)
            {
                count++;

                switch (count)
                {
                    case 1:
                        _endereco.Logradouro = RemoverCaracteres(m.Groups[1].Value);
                        break;
                    case 2:
                        _endereco.Bairro = RemoverCaracteres(m.Groups[1].Value);
                        break;
                    case 3:
                        _endereco.Cidade = RemoverCaracteres(m.Groups[1].Value.Trim().Split('/')[0]);
                        _endereco.UF = RemoverCaracteres(m.Groups[1].Value.Trim().Split('/')[1]);
                        break;
                }

                _endereco.Resultado = "OK";
            }            
        }
        catch (Exception ex)
        {
            try
            {   //Método antigo
                //Cria um DataSet  baseado no retorno do XML
                DataSet ds = new DataSet();
                ds.ReadXml("http://cep.republicavirtual.com.br/web_cep.php?cep=" + CEP.Replace("-", "").Trim() + "&formato=xml");

                if (ds != null)
                {
                    if (ds.Tables[0].Rows.Count > 0)
                    {
                        _resultado = ds.Tables[0].Rows[0]["resultado"].ToString();
                        switch (_resultado)
                        {
                            case "1":
                                _endereco.UF = ds.Tables[0].Rows[0]["uf"].ToString().Trim();
                                _endereco.Cidade = ds.Tables[0].Rows[0]["cidade"].ToString().Trim();
                                _endereco.Bairro = ds.Tables[0].Rows[0]["bairro"].ToString().Trim();
                                _endereco.TipoLogradouro = ds.Tables[0].Rows[0]["tipo_logradouro"].ToString().Trim();
                                _endereco.Logradouro = ds.Tables[0].Rows[0]["logradouro"].ToString().Trim();
                                _endereco.Resultado = "1";
                                break;
                            case "2":
                                _endereco.UF = ds.Tables[0].Rows[0]["uf"].ToString().Trim();
                                _endereco.Cidade = ds.Tables[0].Rows[0]["cidade"].ToString().Trim();
                                _endereco.Bairro = "";
                                _endereco.TipoLogradouro = "";
                                _endereco.Logradouro = "";
                                _endereco.Resultado = "2";
                                break;
                            default:
                                _endereco.UF = "";
                                _endereco.Cidade = "";
                                _endereco.Bairro = "";
                                _endereco.TipoLogradouro = "";
                                _endereco.Logradouro = "";
                                _endereco.Resultado = "0";
                                break;
                        }
                    }
                }
            }
            catch (Exception excep)
            {
            }
            finally
            {
                //Necessário para que o WS não fique travado   
            }
        }
        finally
        {
            //Necessário para que o WS não fique travado   
        }
        return _endereco;
    }

    private string RemoverCaracteres(string texto)
    {
        string resultado = texto;

        resultado = resultado.Replace("\n", "");
        resultado = resultado.Replace("\r", "");
        resultado = resultado.Replace("\t", "");
        resultado = resultado.Trim();

        return resultado;
    }
}

[DataContract]
public class EnderecoCEP
{
    private string _uf;
    private string _cidade;
    private string _bairro;
    private string _TipoLogradouro;
    private string _logradouro;
    private string _resultado;
    private string _TipoCEP;

    [DataMember]
    public string UF
    {
        get { return _uf; }
        set { _uf = value; }
    }

    [DataMember]
    public string Cidade
    {
        get { return _cidade; }
        set { _cidade = value; }
    }

    [DataMember]
    public string Bairro
    {
        get { return _bairro; }
        set { _bairro = value; }
    }

    [DataMember]
    public string TipoLogradouro
    {
        get { return _TipoLogradouro; }
        set { _TipoLogradouro = value; }
    }

    [DataMember]
    public string Logradouro
    {
        get { return _logradouro; }
        set { _logradouro = value; }
    }

    [DataMember]
    public string Resultado
    {
        get { return _resultado; }
        set { _resultado = value; }
    }

    [DataMember]
    public string TipoCEP
    {
        get { return _TipoCEP; }
        set { _TipoCEP = value; }
    }
}
